# 导入对应的异常类
import uvicorn
from fastapi.exceptions import HTTPException
from fastapi.responses import PlainTextResponse
from fastapi import FastAPI, Request

'''
    重写默认异常处理程序
    FastAPI 有一些默认的异常处理程序
    比如：当引发 HTTPException 并且请求包含无效数据时，异常处理程序负责返回默认的 JSON 响应
    可以使用自己的异常处理程序覆盖（重写）这些默认的异常处理程序
 
'''

app = FastAPI()


# 重写 HTTPException 异常处理程序
@app.exception_handler(HTTPException)
async def http_exception_handler(request: Request, exc: HTTPException):
    # 原来是返回 JSONResponse，现在改成返回 PlainTextResponse
    return PlainTextResponse(content=exc.detail, status_code=exc.status_code)
    # 响应头变为了text/plain

@app.get("/items2/{item_id}")
async def read_item(item_id: int):
    if item_id == 3:
        # 抛出HTTPException
        raise HTTPException(status_code=418, detail="Nope! I don't like 3.")
    return {"item_id": item_id}


'''
    重写请求验证异常的处理程序
    当请求包含无效数据时，FastAPI 会在内部引发 RequestValidationError，它还包括一个默认的异常处理程序
    
    
'''

if __name__ == "__main__":
    uvicorn.run(app="main4:app", host="127.0.0.1", port=8000, reload=True, debug=True)
